package com.roy.bloom;

import java.util.BitSet;
import java.util.HashSet;
import java.util.Set;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;

/**
 * 分布式环境下的BloomFilter。
 * 主要是把BloomFilter的BitArray整理出来，存入外部数据源，如redis
 * 2019年8月7日 目前这个方式是直接把BitArray的setBit方法改成了redis的setBit方法。直接将数据保存进redis.
 * 实现是可以了，但是面临redis访问次数太多，还有redis的value过大的问题。
 * @author roykingw 2019年8月6日
 *
 */
public class DistributedBloomDemo {
	
	public static void main(String[] args) throws Exception{
		JedisCluster jedis = getJedisCluster();
		MyBloomFilter filter = new MyBloomFilter(10000,0.1,jedis);
		//加载数据
//		for(int i = 0 ; i < 10000 ; i ++) {
//			System.out.println("i="+i);
//			filter.put(""+i);
//		}
		//mightContain：可能存在。
		// 集合中已有的记录，肯定会返回true
		// 集合里没有的记录，有一定错误率会返回ture。错误率基本符合预设值。
		// 如果记录返回的结果是false，那该记录肯定不在集合里。
		for(int j = 9900; j < 10100 ; j ++) {
			long starttime = System.currentTimeMillis();
//			System.out.println(j+":"+filter.test(""+j));
			System.out.println(j+":"+filter.mightContain(""+j));
			long stoptime = System.currentTimeMillis();
			System.out.println(j+" 条消耗时间 "+(starttime - stoptime));
		}
		jedis.close();
	}
	
	private static JedisCluster getJedisCluster() {
		Set<HostAndPort> nodes = new HashSet<>();
		nodes.add(new HostAndPort("172.16.49.39",6379));
		nodes.add(new HostAndPort("172.16.49.40",6379));
		nodes.add(new HostAndPort("172.16.49.41",6379));
		JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(200);
        config.setMaxIdle(200);
        config.setMinIdle(10);
        config.setMaxWaitMillis(1000);
        
        return new JedisCluster(nodes,
                2000,
                2000,
                8,
                "Redis@ssfk$123SIT",
                config);
	}
}
